package cn.skyclass.business
{
	import flash.events.Event;
	
	import mx.collections.ArrayCollection;
	
	/**
	 * 用作菜单的数据源的数据项
	 */
	[Bindable]
	public class MenuItem
	{					
		public function MenuItem(id:String, name:String, value:String="", 
			type:String=null, data:Object=null, enabled:Boolean=true, 
			icon:Class=null, icon2:Class=null){
				
			this.id = id;
			this.name = name;
			this.value = value;
			
			this.type = type;
			this.data = data;
			this.enabled = enabled;
			this.icon = icon;
			this.icon2 = icon2;
		}
		
		
		public var id:String;		
		public var name:String;		
		public var value:String;

		public var enabled:Boolean;
		public var type:String;
		public var data:Object;
		public var icon:Class;
		public var icon2:Class;
		
		public var eventInfo:Event;		
		public var eventListener:Object;		
		
		public var toggled:Boolean;
		public var parent:MenuItem;
		public var children:ArrayCollection;
		
		public function get label():String{
			return this.name;
		}

		/**
		 * 是否存在子菜单
		 */
		public function hasSubMenu():Boolean{
			return this.children != null;
		}
		
		/**
		 * 为当前菜单添加子菜单，并返回自身引用
		 */
		public function appendSubMenu(menu:MenuItem):MenuItem{
			if(this.children == null){
				this.children = new ArrayCollection();
			}
			this.children.addItem(menu);
			menu.parent = this;
			
			return this;
		}
		
		/**
		 * 移除所有的子菜单
		 */		
		public function removeAllSubMenu():void{
			if(this.children){
				for each(var mi:MenuItem in this.children){
					mi.parent = null;
				}
				this.children.removeAll();
				this.children = null;
			}
		}
		
		/**
		 * 获取当前菜单的某个直接子菜单
		 * @param index
		 * @return 
		 */
		public function getSubMenu(index:int):MenuItem{
			if(index >= 0 && index <= this.children.length){
				return this.children.getItemAt(index) as MenuItem;
			}else{
				return null;
			}
		}
		
		/**
		 * 根据 id 来查找当前菜单的子菜单
		 * @param id 要查找的 id 字符串
		 * @param recursive 是否递归查找所有子菜单。默认值为 false，即只在其直接子菜单中寻找
		 * @param strictMatch 是否对 id 进行严格匹配。默认值为 true，即进行正常的字符串相等性比较；
		 * 		若设为 false，则只需此菜单的 id 字符串含有传入的参数 id 字符串即视为相等。
		 * @return 
		 */		
		public function getSubMenuById(id:String, 
			recursive:Boolean=false, strictMatch:Boolean=true):MenuItem{
			for each(var mi:MenuItem in this.children){
				if(strictMatch){
					if(mi.id == id){ return mi; }
				}else{
					if(mi.id && mi.id.indexOf(id) >= 0){ return mi; }
				}
				
				if(recursive){
					var cmi:MenuItem = mi.getSubMenuById(mi.id, recursive);
					if(cmi){ return cmi; }
				}
			}
			return null;
		}
		
		/**
		 * 根据 id 来查找当前菜单的某个父菜单
		 * @param id 要查找的 id 字符串
		 * @param strictMatch 是否对 id 进行严格匹配。默认值为 true，即进行正常的字符串相等性比较；
		 * 		若设为 false，则只需此菜单的 id 字符串含有传入的参数 id 字符串即视为相等。
		 * @param includeMe 是否包括自身。默认值为 false，若设为 true，则首先对自身的 id 进行比较。
		 * @return 
		 */		
		public function getParentMenuById(id:String, 
			strictMatch:Boolean=true, includeMe:Boolean=false):MenuItem{
			var temp:MenuItem = includeMe ? this : this.parent;
			while(temp){
				if(strictMatch){
					if(temp.id == id){ return temp; }
				}else{
					if(temp.id && temp.id.indexOf(id) >= 0){ return temp; }
				}
				temp = temp.parent;
			}
			return null;
		}
		
	}
}
